package processamento;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Indicacao {
	private List<File> filesResultados;
	private final float probabilidade;
	private Map<String, Integer> hits = new HashMap<String, Integer>();
	
	public Indicacao(List<File> filesResultados) throws FileNotFoundException, IOException {
		this(filesResultados, (float)0.5);
	}
	public Indicacao(List<File> filesResultados, float probabilidade) throws FileNotFoundException, IOException {
		this.filesResultados = filesResultados;
		this.probabilidade = probabilidade;
		
		
		for(File file : filesResultados) {
			Map<Integer, List<String>> resultado = processClustersFile(file);
			countHits(resultado);
		}

	}
	
	public void printResult() {
		List<String> keys = new ArrayList<String>(hits.keySet());
		Collections.sort(keys, String.CASE_INSENSITIVE_ORDER);
		for(String key : keys) {
			float p = (float)hits.get(key) / filesResultados.size();
			if(p >= probabilidade) {
				System.out.println(key);
			}
		}
	}
	private Map<Integer, List<String>> processClustersFile(File file) throws FileNotFoundException,
			IOException {
		Map<Integer, List<String>> resultado = new HashMap<Integer, List<String>>();
		BufferedReader reader = new BufferedReader(new FileReader(file));
		
		String line = null;
		Integer group = -1;
		while((line = reader.readLine()) != null) {
			if(!line.startsWith("\t")) {
				group = Integer.parseInt(line);
			}
			else {
				if(!resultado.containsKey(group)) {
					resultado.put(group, new ArrayList<String>());
				}
				resultado.get(group).add(line.substring(1));
			}
		}
		return resultado;
	}
	private void countHits(Map<Integer, List<String>> resultado) {
		for(Integer groupI : resultado.keySet()) {
			List<String> pessoas = resultado.get(groupI);
			Collections.sort(pessoas, String.CASE_INSENSITIVE_ORDER);
			for(int i = 0; i < pessoas.size(); i++) {
				String nome1 = pessoas.get(i);
				for(int j = i + 1; j < pessoas.size(); j++) {
					String nome2 = pessoas.get(j);
					String key = nome1 + "->" + nome2;
					if(!hits.containsKey(key))
						hits.put(key, 0);
					else
						hits.put(key, hits.get(key) + 1);
				}
			}
			//for()
		}
	}
}
